!// Dmitry.Konovalov@jcu.edu.au Dmitry.A.Konovalov@gmail.com, 2013

module types_mod; 
implicit none;


! need this to access external libs
integer, parameter:: DP = kind(1.0D0);                   ! double precision
!integer, parameter:: DP = 16;


!integer, parameter:: DP = selected_real_kind(14);
! above replaced by below on 19-Mar-2013, see help below
!integer, parameter:: DP = kind(0.D0)                   ! double precision

! from http://fortran90.org/src/best-practices.html
!integer, parameter:: dp=kind(0.d0)                   ! double precision
!!and declare floats as:
!real(dp) :: a, b, c
!!Always write all floating point constants with the _dp suffix:
!1.0_dp, 3.5_dp, 1.34e8_dp


!type CONTEXT_T ! good idea in fortran????
! real(DP) :: A, B, C, D, E, F, G, H;
! integer   :: I, J, K, L, M, N; 
! real(DP) :: P, Q, R, S, T, U, V, W, X, Y, Z; ! not 'o'; too close to '0'
!end type

!http://en.wikipedia.org/wiki/E_%28mathematical_constant%29
!2.7182818284590452353602874713526624977572
real(DP), parameter :: EXP1 = 2.7182818284590452353602874713526624977572_DP;

!real(DP), parameter :: PI=ACOS(-1._DP);! THIS GETS ONLY SINGLE-precision !?!?!?!
real(DP), parameter :: PI=3.14159265358979323846264338327950288_DP;
!http://en.wikipedia.org/wiki/Pi
!3.14159 26535 89793 23846 26433 83279 50288

real(DP), parameter :: EPS1 = 1.E-1_DP;
real(DP), parameter :: EPS2 = 1.E-2_DP;
real(DP), parameter :: EPS3 = 1.E-3_DP;
real(DP), parameter :: EPS4 = 1.E-4_DP;
real(DP), parameter :: EPS5 = 1.E-5_DP;
real(DP), parameter :: EPS6 = 1.E-6_DP;
real(DP), parameter :: EPS7 = 1.E-7_DP;
real(DP), parameter :: EPS8 = 1.E-8_DP;
real(DP), parameter :: EPS9 = 1.E-9_DP;
real(DP), parameter :: EPS10 = 1.E-10_DP;
real(DP), parameter :: EPS11 = 1.E-11_DP;
real(DP), parameter :: EPS12 = 1.E-12_DP;
real(DP), parameter :: EPS13 = 1.E-13_DP;
real(DP), parameter :: EPS14 = 1.E-14_DP;
real(DP), parameter :: EPS15 = 1.E-15_DP;
real(DP), parameter :: EPS16 = 1.E-16_DP;
real(DP), parameter :: EPS17 = 1.E-17_DP;
real(DP), parameter :: EPS18 = 1.E-18_DP;
real(DP), parameter :: EPS19 = 1.E-19_DP;
real(DP), parameter :: EPS20 = 1.E-20_DP;
real(DP), parameter :: EPS21 = 1.E-21_DP;
real(DP), parameter :: EPS22 = 1.E-22_DP;
real(DP), parameter :: EPS23 = 1.E-23_DP;
real(DP), parameter :: EPS24 = 1.E-24_DP;
real(DP), parameter :: EPS25 = 1.E-25_DP;
real(DP), parameter :: EPS26 = 1.E-26_DP;
real(DP), parameter :: EPS27 = 1.E-27_DP;
real(DP), parameter :: EPS28 = 1.E-28_DP;
real(DP), parameter :: EPS29 = 1.E-29_DP;
real(DP), parameter :: EPS30 = 1.E-30_DP;
real(DP), parameter :: EPS31 = 1.E-31_DP;
real(DP), parameter :: EPS32 = 1.E-32_DP;
real(DP), parameter :: MAX_ZERO = 1.E-32_DP;

real(DP), parameter :: D0 = 0._DP;
real(DP), parameter :: D1 = 1._DP;
real(DP), parameter :: D2 = 2._DP;
real(DP), parameter :: D3 = 3._DP;
real(DP), parameter :: D4 = 4._DP;
real(DP), parameter :: D5 = 5._DP;
real(DP), parameter :: D6 = 6._DP;
real(DP), parameter :: D7 = 7._DP;
real(DP), parameter :: D8 = 8._DP;
real(DP), parameter :: D9 = 9._DP;

real(DP), parameter :: D10 = 10._DP;
real(DP), parameter :: D11 = 11._DP;
real(DP), parameter :: D12 = 12._DP;
real(DP), parameter :: D13 = 13._DP;
real(DP), parameter :: D14 = 14._DP;
real(DP), parameter :: D15 = 15._DP;
real(DP), parameter :: D16 = 16._DP;
real(DP), parameter :: D17 = 17._DP;
real(DP), parameter :: D18 = 18._DP;
real(DP), parameter :: D19 = 19._DP;

real(DP), parameter :: D20 = 20._DP;
real(DP), parameter :: D24 = 24._DP;

real(DP), parameter :: D30 = 30._DP;
real(DP), parameter :: D32 = 32._DP;
real(DP), parameter :: D34 = 34._DP;

real(DP), parameter :: D40 = 40._DP;
real(DP), parameter :: D45 = 45._DP;

real(DP), parameter :: D50 = 50._DP;
real(DP), parameter :: D60 = 60._DP;
real(DP), parameter :: D70 = 70._DP;
real(DP), parameter :: D80 = 80._DP;
real(DP), parameter :: D90 = 90._DP;

real(DP), parameter :: D100 = 100._DP;
real(DP), parameter :: D114 = 114._DP;
real(DP), parameter :: D120 = 120._DP;
real(DP), parameter :: D144 = 144._DP;

real(DP), parameter :: D200 = 200._DP;
real(DP), parameter :: D300 = 300._DP;
real(DP), parameter :: D400 = 400._DP;
real(DP), parameter :: D720 = 720._DP;

real(DP), parameter :: D01 = 0.1_DP;
real(DP), parameter :: D02 = 0.2_DP;
real(DP), parameter :: D03 = 0.3_DP;
real(DP), parameter :: D04 = 0.4_DP;
real(DP), parameter :: D05 = 0.5_DP;
real(DP), parameter :: D06 = 0.6_DP;
real(DP), parameter :: D07 = 0.7_DP;
real(DP), parameter :: D08 = 0.8_DP;
real(DP), parameter :: D09 = 0.9_DP;

 
complex(DP), parameter :: ZEROc = CMPLX(D0, D0);
complex(DP), parameter :: ONEc = CMPLX(D1, D0);
complex(DP), parameter :: TWOc = CMPLX(D2, D0);
complex(DP), parameter :: ONEi = CMPLX(D0, D1);
  
character(LEN=64), parameter :: STR_EMPTY = "";
character(LEN=64), parameter :: STR_NOT_SET = "*str not set*";
character(LEN=64), parameter :: NAME_NOT_SET = "*name not set*";

end module 